package com.lelouch.examplecode.javabasic.jvm.model;

/**
 * @author lcy
 * @create 2018-12-27 08:11
 */
public class StringTest {
    public static void main(String[] args) {
        //在JDK 1.7下，当执行str2.intern();时，因为常量池中没有“str01”这个字符串，
        // 所以会在常量池中生成一个对堆中的“str01”的引用(注意这里是引用 ，就是这个区别于JDK 1.6的地方。
        // 在JDK1.6下是生成原字符串的拷贝)，
        // 而在进行String str1 = “str01”;字面量赋值的时候，常量池中已经存在一个引用，所以直接返回了该引用，
        // 因此str1和str2都指向堆中的同一个字符串，返回true。
        //String str2 = new String("str")+new String("01");
        //str2.intern();
        //String str1 = "str01";
        //System.out.println(str2==str1);//true

        //常量池中已经存在str01，str2.intern()的时候，返回常量池中的引用，所以str1引用的是常量池中的字符串，
        // str2引用的是堆中的字符串，所以两者不等，返回false
        //String str2 = new String("str01");
        //str2.intern();
        //String str1 = "str01";
        //System.out.println(str2==str1);//false

        //str2引用的是堆中的字符串，str1引用的是常量池中的字符串
        //String str2 = new String("str")+new String("01");
        //String str1 = "str01";
        //str2.intern();
        //System.out.println(str2==str1);//false

        //String s1 = "abc";
        //String s2 = "abc";
        //System.out.println(s1 == s2);//true

        //String s1 = new String("abc");
        //String s2 = new String("abc");
        //System.out.println(s1 == s2);//false

        //false，因为s2+s3实际上是使用StringBuilder.append来完成，会生成不同的对象。
        //String s1 = "abc";
        //String s2 = "a";
        //String s3 = "bc";
        //String s4 = s2 + s3;
        //System.out.println(s1 == s4);//false

        //true，因为final变量在编译后会直接替换成对应的值，所以实际上等于s4=”a”+”bc”，
        // 而这种情况下，编译器会直接合并为s4=”abc”，所以最终s1==s4。
        //String s1 = "abc";
        //final String s2 = "a";
        //final String s3 = "bc";
        //String s4 = s2 + s3;
        //System.out.println(s1 == s4);//true

        String s = new String("abc");
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s == s1.intern());//false
        System.out.println(s == s2.intern());//false
        System.out.println(s1 == s2.intern());//true

    }
}
